home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1980-01-01 | 4.0 KB | 239 lines |
- 10 REM **********BASIC FORTH V. 3 ************
- 11 ' by C. H. Ting
- 12 ' PO BOX 504, Sunnyvale, CA 94086
- 13 ' converted to IBM PC by Art Bevilacqua, 14 Arthur St. Danvers, Ma 01923
- 14 ' See Dr. Dobbs Journal Number 60, October 1981 for the base article
- 20 DIM S(40),R(20),L(10),LO(10)
- 30 DIM I$(80)
- 40 PRINT "BASIC FORTH VERSION V.3"
- 50 REM N IS SP, M IS RP, K IS IP, AND L IS W.
- 60 ON ERROR GOTO 90
- 70 ON KEY(1) GOSUB 2340
- 80 GOTO 100
- 90 PRINT A$," ?"
- 100 M=0
- 110 N=0
- 120 REM ************ TEXT INTERPRETER ************
- 130 K=1
- 140 INPUT I$
- 150 L1=0
- 160 L(K)=L1
- 170 LO(K)=LEN(I$)
- 180 L1=LO(K)
- 190 IF N<0 THEN GOTO 210
- 200 GOTO 230
- 210 PRINT "STACK EMPTY"
- 220 GOTO 100
- 230 L(K)=L(K)+1
- 240 IF L(K)>LO(K) THEN GOTO 350
- 250 B$=MID$(I$,L(K),1)
- 260 IF B$=" " THEN GOTO 230
- 270 A$=B$
- 280 L(K)=L(K)+1
- 290 IF L(K)>LO(K) THEN GOTO 340
- 300 B$=MID$(I$,L(K),1)
- 310 IF B$=" " THEN GOTO 340
- 320 A$=A$+B$
- 330 GOTO 280
- 340 GOTO 400
- 350 IF K<2 THEN GOTO 130
- 360 K=K-1
- 370 I$=MID$(I$,1,LO(K))
- 380 L1=LO(K)
- 390 GOTO 230
- 400 REM *********** DICTIONARY **********
- 410 REM 300-900 :: HIGH LEVEL DEFINITIONS
- 420 IF A$<>"SQUARE" THEN GOTO 470
- 430 B$="DUP *"
- 440 I$=I$+B$
- 450 K=K+1
- 460 GOTO 160
- 470 IF A$<>"CUBE" THEN GOTO 520
- 480 B$="DUP SQUARE *"
- 490 I$=I$+B$
- 500 K=K+1
- 510 GOTO 160
- 520 IF A$<>"TEST" THEN GOTO 570
- 530 B$="DO PI 10 / R@ * SIN . LOOP"
- 540 I$=I$+B$
- 550 K=K+1
- 560 GOTO 160
- 570 REM
- 580 REM *************** LOW LEVEL DEFINITIONS NUCLEUS **********
- 590 IF A$<>"+" THEN GOTO 630
- 600 N=N-1
- 610 S(N)=S(N)+S(N+1)
- 620 GOTO 190
- 630 IF A$<>"-" THEN GOTO 670
- 640 N=N-1
- 650 S(N)=S(N)-S(N+1)
- 660 GOTO 190
- 670 IF A$<>"*" THEN GOTO 710
- 680 N=N-1
- 690 S(N)=S(N)*S(N+1)
- 700 GOTO 190
- 710 IF A$<>"/" THEN GOTO 750
- 720 N=N-1
- 730 S(N)=S(N)/S(N+1)
- 740 GOTO 190
- 750 IF A$<>"ABS" THEN GOTO 780
- 760 S(N)=ABS(S(N))
- 770 GOTO 190
- 780 IF A$<>"ATN" THEN GOTO 810
- 790 S(N)=ATN(S(N))
- 800 GOTO 190
- 810 IF A$<>"COS" THEN GOTO 840
- 820 S(N)=COS(S(N))
- 830 GOTO 190
- 840 IF A$<>"EXP" THEN GOTO 870
- 850 S(N)=EXP(S(N))
- 860 GOTO 190
- 870 IF A$<>"INT" THEN GOTO 900
- 880 S(N)=INT(S(N))
- 890 GOTO 190
- 900 IF A$<>"LOG" THEN GOTO 930
- 910 LET S(N)=LOG(S(N))
- 920 GOTO 190
- 930 IF A$<>"RND" THEN GOTO 960
- 940 S(N)=RND(-N)
- 950 GOTO 190
- 960 IF A$<>"SGN" THEN GOTO 990
- 970 S(N)=SGN(S(N))
- 980 GOTO 190
- 990 IF A$<>"SIN" THEN GOTO 1020
- 1000 S(N)=SIN(S(N))
- 1010 GOTO 190
- 1020 IF A$<>"SQR" THEN GOTO 1050
- 1030 S(N)=SQR(S(N))
- 1040 GOTO 190
- 1050 IF A$<>"TAN" THEN GOTO 1080
- 1060 S(N)=TAN(S(N))
- 1070 GOTO 190
- 1080 IF A$<>"^" THEN GOTO 1120
- 1090 N=N-1
- 1100 S(N)=S(N)^S(N+1)
- 1110 GOTO 190
- 1120 IF A$<>"S?" THEN GOTO 1170
- 1130 FOR I=1 TO N
- 1140 PRINT S(N-I+1)
- 1150 NEXT I
- 1160 GOTO 190
- 1170 IF A$<>"." THEN GOTO 1220
- 1180 IF N<1 THEN GOTO 210
- 1190 PRINT S(N)
- 1200 N=N-1
- 1210 GOTO 190
- 1220 IF A$<>"DUP" THEN GOTO 1260
- 1230 N=N+1
- 1240 S(N)=S(N-1)
- 1250 GOTO 190
- 1260 IF A$<>"DROP" THEN GOTO 1290
- 1270 N=N-1
- 1280 GOTO 190
- 1290 IF A$<>"SWAP" THEN GOTO 1340
- 1300 S(N+1)=S(N-1)
- 1310 S(N-1)=S(N)
- 1320 S(N)=S(N+1)
- 1330 GOTO 190
- 1340 IF A$<>"OVER" THEN GOTO 1380
- 1350 N=N+1
- 1360 S(N)=S(N-2)
- 1370 GOTO 190
- 1380 IF A$<>">R" THEN GOTO 1430
- 1390 M=M+1
- 1400 R(M)=S(N)
- 1410 N=N-1
- 1420 GOTO 190
- 1430 IF A$<>"R>" THEN GOTO 1480
- 1440 N=N+1
- 1450 S(N)=R(M)
- 1460 M=M-1
- 1470 GOTO 190
- 1480 IF A$<>"R@" THEN GOTO 1520
- 1490 N=N+1
- 1500 S(N)=R(M)
- 1510 GOTO 190
- 1520 REM **************CONTROL STRUCTURES **************
- 1530 IF A$<>"=" THEN GOTO 1600
- 1540 N=N-1
- 1550 IF S(N)=S(N+1) THEN GOTO 1580
- 1560 S(N)=0
- 1570 GOTO 190
- 1580 S(N)=1
- 1590 GOTO 190
- 1600 IF A$<>">" THEN GOTO 1670
- 1610 N=N-1
- 1620 IF S(N)>S(N+1) THEN GOTO 1650
- 1630 S(N)=0
- 1640 GOTO 190
- 1650 S(N)=1
- 1660 GOTO 190
- 1670 IF A$<>"<" THEN GOTO 1740
- 1680 N=N-1
- 1690 IF S(N)<S(N+1) THEN GOTO 1720
- 1700 S(N)=0
- 1710 GOTO 190
- 1720 S(N)=1
- 1730 GOTO 190
- 1740 IF A$<>"IF" THEN GOTO 1870
- 1750 N=N-1
- 1760 IF S(N+1) THEN GOTO 190
- 1770 FOR I=L(K) TO LO(K)-3
- 1780 B$=MID$(I$,I,4)
- 1790 IF B$="ELSE" THEN GOTO 1840
- 1800 IF B$="THEN" THEN GOTO 1840
- 1810 NEXT I
- 1820 PRINT "IF?"
- 1830 GOTO 100
- 1840 L(K)=I+4
- 1850 GOTO 190
- 1860 GOTO 190
- 1870 IF A$<>"ELSE" THEN GOTO 1890
- 1880 GOTO 1770
- 1890 IF A$<>"THEN" THEN GOTO 1910
- 1900 GOTO 190
- 1910 IF A$<>"BEGIN" THEN GOTO 1950
- 1920 M=M+1
- 1930 R(M)=L(K)
- 1940 GOTO 190
- 1950 IF A$<>"UNTIL" THEN GOTO 2030
- 1960 N=N-1
- 1970 IF S(N+1) THEN GOTO 2010
- 1980 IF S(N+1) THEN GOTO 190
- 1990 L(K)=R(M)
- 2000 GOTO 190
- 2010 M=M-1
- 2020 GOTO 190
- 2030 IF A$<>"DO" THEN GOTO 2120
- 2040 M=M+1
- 2050 R(M)=L(K)
- 2060 M=M+1
- 2070 R(M)=S(N-1)
- 2080 M=M+1
- 2090 R(M)=S(N)
- 2100 N=N-2
- 2110 GOTO 190
- 2120 IF A$<>"LOOP" THEN GOTO 2190
- 2130 R(M)=R(M)+1
- 2140 IF R(M-1)>R(M) THEN GOTO 2170
- 2150 M=M-3
- 2160 GOTO 190
- 2170 L(K)=R(M-2)
- 2180 GOTO 190
- 2190 REM ********* CONSTANTS **************
- 2200 IF A$<>"PI" THEN GOTO 2240
- 2210 N=N+1
- 2220 S(N)=3.14159
- 2230 GOTO 190
- 2240 IF A$<>"0" THEN GOTO 2280
- 2250 N=N+1
- 2260 S(N)=0
- 2270 GOTO 190
- 2280 IF A$<>"STOP" THEN GOTO 2300
- 2290 STOP
- 2300 REM ********* NUMBER **********
- 2310 N=N+1
- 2320 S(N)=VAL(A$)
- 2330 GOTO 190
- 2340 END
-